]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/volume: Allow changing input volume by scrolling
authorRazze <razzeee@gmail.com>
Wed, 13 Jan 2021 21:56:04 +0000 (22:56 +0100)
committerKolja Lampe <razzeee@gmail.com>
Thu, 14 Jan 2021 00:13:17 +0000 (01:13 +0100)
Previously scrolling on the volume or input indicator would always
change the volume. This change lets you change the input volume if
you scroll over the input indicator.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3273

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1566>

js/ui/status/volume.js

index 7b50658715f91a8871155cc27cc70124f50b0f78..0b3221f6729a2cf49e1ab6a943a2d277ead4bdae 100644 (file)
@@ -11,6 +11,11 @@ const Slider = imports.ui.slider;
 
 const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent';
 
+const VolumeType = {
+    OUTPUT: 0,
+    INPUT: 1,
+};
+
 // Each Gvc.MixerControl is a connection to PulseAudio,
 // so it's better to make it a singleton
 let _mixerControl;
@@ -342,8 +347,10 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
         this._onControlStateChanged();
     }
 
-    scroll(event) {
-        return this._output.scroll(event);
+    scroll(type, event) {
+        return type === VolumeType.INPUT
+            ? this._input.scroll(event)
+            : this._output.scroll(event);
     }
 
     _onControlStateChanged() {
@@ -363,20 +370,22 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
         this._input.stream = this._control.get_default_source();
     }
 
-    getOutputIcon() {
-        return this._output.getIcon();
+    getIcon(type) {
+        return type === VolumeType.INPUT
+            ? this._input.getIcon()
+            : this._output.getIcon();
     }
 
-    getInputIcon() {
-        return this._input.getIcon();
+    getLevel(type) {
+        return type === VolumeType.INPUT
+            ? this._input.getLevel()
+            : this._output.getLevel();
     }
 
-    getLevel() {
-        return this._output.getLevel();
-    }
-
-    getMaxLevel() {
-        return this._output.getMaxLevel();
+    getMaxLevel(type) {
+        return type === VolumeType.INPUT
+            ? this._input.getMaxLevel()
+            : this._output.getMaxLevel();
     }
 
     getInputVisible() {
@@ -392,10 +401,18 @@ class Indicator extends PanelMenu.SystemIndicator {
         this._primaryIndicator = this._addIndicator();
         this._inputIndicator = this._addIndicator();
 
+        this._primaryIndicator.reactive = true;
+        this._inputIndicator.reactive = true;
+
+        this._primaryIndicator.connect('scroll-event',
+            (actor, event) => this._handleScrollEvent(VolumeType.OUTPUT, event));
+        this._inputIndicator.connect('scroll-event',
+            (actor, event) => this._handleScrollEvent(VolumeType.INPUT, event));
+
         this._control = getMixerControl();
         this._volumeMenu = new VolumeMenu(this._control);
         this._volumeMenu.connect('output-icon-changed', () => {
-            let icon = this._volumeMenu.getOutputIcon();
+            let icon = this._volumeMenu.getIcon(VolumeType.OUTPUT);
 
             if (icon != null)
                 this._primaryIndicator.icon_name = icon;
@@ -407,7 +424,7 @@ class Indicator extends PanelMenu.SystemIndicator {
             this._inputIndicator.visible = this._volumeMenu.getInputVisible();
         });
         this._volumeMenu.connect('input-icon-changed', () => {
-            let icon = this._volumeMenu.getInputIcon();
+            let icon = this._volumeMenu.getIcon(VolumeType.INPUT);
 
             if (icon !== null)
                 this._inputIndicator.icon_name = icon;
@@ -416,14 +433,14 @@ class Indicator extends PanelMenu.SystemIndicator {
         this.menu.addMenuItem(this._volumeMenu);
     }
 
-    vfunc_scroll_event() {
-        let result = this._volumeMenu.scroll(Clutter.get_current_event());
+    _handleScrollEvent(type, event) {
+        const result = this._volumeMenu.scroll(type, event);
         if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
             return result;
 
-        let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
-        let level = this._volumeMenu.getLevel();
-        let maxLevel = this._volumeMenu.getMaxLevel();
+        const gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon(type) });
+        const level = this._volumeMenu.getLevel(type);
+        const maxLevel = this._volumeMenu.getMaxLevel(type);
         Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
         return result;
     }